/********************************************************************************
* Copyright (c) 2009, Matteo Pelati (matteo.pelati@gmail.com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of the <organization> nor the
*       names of its contributors may be used to endorse or promote products
*       derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY Matteo Pelati ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**************************************************************************************/

#include "stdafx.h"
#include <iostream>
#include <exception>


#include "DbEnvironment.h"
#include "DbXmlManager.h"
#include "DbXmlQueryContext.h"
#include "DbException.h"
#include "DbXmlException.h"
#include "DbXmlIndexSpecification.h"


namespace BerkeleyDB { namespace Xml
{

	void DbXmlIndexSpecification::AddDefaultIndex(String^ index)
	{
		try
		{
			CLRSTR2STDSTR(cindex, index);
			n_spec->addDefaultIndex(cindex);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::AddDefaultIndex(DbXmlIndexSpecificationFlags type, DbXmlValueType syntax)
	{
		try
		{
			n_spec->addDefaultIndex((XmlIndexSpecification::Type) type, (XmlValue::Type)  syntax);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::AddIndex(String^ uri, String^ name, String^ index)
	{
		try
		{
			CLRSTR2STDSTR(curi, uri);
			CLRSTR2STDSTR(cname, name);
			CLRSTR2STDSTR(cindex, index);
			n_spec->addIndex(curi, cname, cindex);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::AddIndex(String^ uri, String^ name, DbXmlIndexSpecificationFlags type, DbXmlValueType syntax)
	{
		try
		{
			CLRSTR2STDSTR(curi, uri);
			CLRSTR2STDSTR(cname, name);
			n_spec->addIndex(curi, cname, (XmlIndexSpecification::Type) type, (XmlValue::Type)  syntax);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::DeleteDefaultIndex(String^ index)
	{
		try
		{
			CLRSTR2STDSTR(cindex, index);
			n_spec->deleteDefaultIndex(cindex);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::DeleteDefaultIndex(DbXmlIndexSpecificationFlags type, DbXmlValueType syntax)
	{
		try
		{
			n_spec->deleteDefaultIndex((XmlIndexSpecification::Type) type, (XmlValue::Type)  syntax);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::DeleteIndex(String^ uri, String^ name, String^ index)
	{
		try
		{
			CLRSTR2STDSTR(curi, uri);
			CLRSTR2STDSTR(cname, name);
			CLRSTR2STDSTR(cindex, index);
			n_spec->deleteIndex(curi, cname, cindex);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::DeleteIndex(String^ uri, String^ name, DbXmlIndexSpecificationFlags type, DbXmlValueType syntax)
	{
		try
		{
			CLRSTR2STDSTR(curi, uri);
			CLRSTR2STDSTR(cname, name);
			n_spec->deleteIndex(curi, cname, (XmlIndexSpecification::Type) type, (XmlValue::Type)  syntax);
		}
		rethrowDbXmlException();
	}

	bool DbXmlIndexSpecification::Find(String^ uri, String^ name, [Out] String^% index)
	{
		try
		{
			CLRSTR2STDSTR(curi, uri);
			CLRSTR2STDSTR(cname, name);
			std::string cindex;
			if (n_spec->find(curi, cname, cindex))
			{
				index = gcnew String(cindex.c_str());
				return true;
			}
			return false;
		}
		rethrowDbXmlException();
	}

	bool DbXmlIndexSpecification::Next([Out] String^% uri, [Out] String^% name, [Out] String^% index)
	{
		try
		{
			std::string curi;
			std::string cname;
			std::string cindex;
			bool retval = n_spec->next(curi, cname, cindex);
			uri = gcnew String(curi.c_str());
			name = gcnew String(cname.c_str());
			index = gcnew String(cindex.c_str());
			return retval;
		}
		rethrowDbXmlException();
	}

	bool DbXmlIndexSpecification::Next([Out] String^% uri, [Out] String^% name, [Out] DbXmlIndexSpecificationFlags% type, [Out] DbXmlValueType% syntax)
	{
		try
		{
			std::string curi;
			std::string cname;
			XmlIndexSpecification::Type ctype;
			XmlValue::Type csyntax;
			bool retval = n_spec->next(curi, cname, ctype, csyntax);
			uri = gcnew String(curi.c_str());
			name = gcnew String(cname.c_str());
			type = (DbXmlIndexSpecificationFlags) ctype;
			syntax = (DbXmlValueType) csyntax;
			return retval;	
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::ReplaceDefaultIndex(String^ index)
	{
		try
		{
			CLRSTR2STDSTR(cindex, index);
			n_spec->replaceDefaultIndex(cindex);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::ReplaceDefaultIndex(DbXmlIndexSpecificationFlags type, DbXmlValueType syntax)
	{
		try
		{
			n_spec->replaceDefaultIndex((XmlIndexSpecification::Type) type, (XmlValue::Type)  syntax);	
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::ReplaceIndex(String^ uri, String^ name, String^ index)
	{
		try
		{
			CLRSTR2STDSTR(curi, uri);
			CLRSTR2STDSTR(cname, name);
			CLRSTR2STDSTR(cindex, index);
			return n_spec->replaceIndex(curi, cname, cindex);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::ReplaceIndex(String^ uri, String^ name, DbXmlIndexSpecificationFlags type, DbXmlValueType syntax)
	{
		try
		{
			CLRSTR2STDSTR(curi, uri);
			CLRSTR2STDSTR(cname, name);
			n_spec->replaceIndex(curi, cname, (XmlIndexSpecification::Type) type, (XmlValue::Type)  syntax);
		}
		rethrowDbXmlException();
	}

	void DbXmlIndexSpecification::Reset()
	{
		try
		{
			n_spec->reset();
		}
		rethrowDbXmlException();
	}


}}